home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / FlyPaper.sit / Fly Paper / FlyPaper Source / Extension Sources / FlyPaperINIT.c next >
Text File  |  1996-06-22  |  3KB  |  103 lines

  1. #ifndef FLYPAPERINIT_H
  2. #include "FlyPaperINIT.h"
  3. #endif
  4.  
  5. #ifndef __A4STUFF__
  6. #include <A4Stuff.h>
  7. #endif
  8.  
  9. #define    _DragDispatch            0xABED
  10. #define    kSuccessIconID            128
  11. #define    kFailureIconID            129
  12. #define    kFlyCursor1ResID        128
  13. #define    kFlyCursor2ResID        129
  14.  
  15. FlyPaperGestaltRec                gFlyPaperData;
  16.  
  17. static
  18. pascal    OSErr    myGestaltRoutine (long /* selector */, FlyPaperGestaltPtr *result)
  19. {
  20.     EnterCodeResource ();
  21.     *result = &gFlyPaperData;
  22.     ExitCodeResource ();
  23.     return (noErr);
  24. }
  25.  
  26. static asm
  27. void myDragDispatch (void)
  28. {
  29.     MOVE.L            A4,-(SP)                            // -4    stash A4
  30.     PEA                8(SP)                                // -8    push pointer to last param
  31.     MOVE.W            D0, -(SP)                            // -A    push selector
  32.     JSR                SetCurrentA4                        //         setup A4
  33.     TST.W            gFlyPaperData.enabled                //         if disabled don't patch
  34.     BEQ                cleanup
  35.     MOVE.L            gFlyPaperData.flyPaperCode, A0        //         get code handle
  36.     MOVE.L            (A0), A0                            //         deref
  37.     JSR                (A0)                                //         call code
  38. cleanup:
  39.     MOVE.W            (SP)+, D0                            // -8    restore selector
  40.     ADDQ.L            #4, SP                                // -4    pop param
  41.     MOVE.L            gFlyPaperData.realDragManager, A0    //         ROM address
  42.     MOVE.L            (SP)+, A4                            // 0    restore A4
  43.     JMP                (A0)                                //         call real drag manager
  44. }
  45.  
  46. void main (void)
  47. {
  48.     EnterCodeResource ();
  49.     Handle        me = Get1Resource ('INIT', 129);
  50.     Boolean        success = false;
  51.     Handle        showINITCode;
  52.     Handle        cursor;
  53.     
  54.     if (!me)
  55.         goto Exit;
  56.     
  57.     if (Button ())
  58.         goto Exit;
  59.     
  60.     gFlyPaperData.enabled = false;
  61.     gFlyPaperData.flyPaperCode = Get1Resource (kFlyPaperResType, kFlyPaperResID);
  62.     if (gFlyPaperData.flyPaperCode == nil)
  63.         goto Exit;
  64.     
  65.     if (NewGestalt (kSignature, (SelectorFunctionUPP) myGestaltRoutine))
  66.         goto Exit;
  67.  
  68.     cursor = Get1Resource ('CURS', kFlyCursor1ResID);
  69.     if (!cursor)
  70.         goto Exit;
  71.     BlockMoveData (*cursor, &gFlyPaperData.flyCursors [0], sizeof (Cursor));
  72.     
  73.     cursor = Get1Resource ('CURS', kFlyCursor2ResID);
  74.     if (!cursor)
  75.         goto Exit;
  76.     BlockMoveData (*cursor, &gFlyPaperData.flyCursors [1], sizeof (Cursor));
  77.  
  78.     gFlyPaperData.magicWindow = nil;
  79.     
  80.     DetachResource (gFlyPaperData.flyPaperCode);
  81.     
  82.     gFlyPaperData.realDragManager = GetToolTrapAddress (_DragDispatch);    
  83.     SetToolTrapAddress ((UniversalProcPtr) myDragDispatch, _DragDispatch);
  84.     
  85.     success = true;
  86.     
  87. Exit:
  88.     
  89.     showINITCode = Get1Resource ('SHOW', 128);
  90.     
  91.     if (success) {
  92.         DetachResource (me);
  93.         gFlyPaperData.enabled = true;
  94.         if (showINITCode)
  95.             ((pascal void (*) (short, Boolean)) *showINITCode) (kSuccessIconID, true);
  96.     } else if (gFlyPaperData.flyPaperCode) {
  97.         DisposeHandle (gFlyPaperData.flyPaperCode);
  98.         if (showINITCode)
  99.             ((pascal void (*) (short, Boolean)) *showINITCode) (kFailureIconID, true);
  100.     }
  101.         
  102.     ExitCodeResource ();
  103. }